package com.cxl.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * @author: 20971
 * @time: 2022/3/3 16:29
 * @description:
 */

/*
toString导致栈溢出,原因是执行该方法时,你会打印
private List<UserCoupon> userCoupons;后UserCoupon不断查查查,导致递归最终导致栈内存溢出
报错信息 : java.lang.StackOverflowError
 */

@Data
@Entity
@Table(name = "many_users")
public class Users implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /*用户名*/
    @Column(length = 100)
    private String username;

    /*日期*/
    @Column
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Temporal(value = TemporalType.DATE)
    private Date created;

    /*
    一对多关系,,一个用户有多个优惠卷
@JoinTable中属性name ：多对多中间表名称
joinColumns ：这个字段是中间表的字段，对应的是主表t_user表中的主键（id）
inverseJoinColumns ：这个字段是中间表role_id的字段，对应的是从表t_role表中的主键（id）
     */
/*
    @ManyToMany
    @JoinTable(name = "many_users_coupon"
            ,joinColumns = @JoinColumn(name = "users_id")
            ,inverseJoinColumns = @JoinColumn(name = "coupon_id"))
    private List<Coupon> coupons;
*/

    /*拥有的优惠卷*/
    @OneToMany(mappedBy = "users"
            ,fetch = FetchType.EAGER
            ,cascade = {CascadeType.PERSIST},
            orphanRemoval=true)
    private List<UserCoupon> userCoupons;

    @Transient
    private String couponName;

    @Transient
    private List<Integer> userCouponids;
}
